home *** CD-ROM | disk | FTP | other *** search
Text File | 1997-04-25 | 6.6 KB | 278 lines | [TEXT/CWIE] |
- // ==================================================
- // CPrefsFile.cp
- // Copyright (C) 1996-1997 Mizutori Tetsuya
- // July 4 ,1996; February 3, 1997; March 14, 1997.
- // ==================================================
- // All documents are pretty-printed in 10-point Geneva font.
-
- #pragma once
-
- #include <UMemoryMgr.h>
- //#include <UResourceMgr.h>
- //#include <LString.h>
-
- #include "CPrefsFile.h"
-
-
- const OSType kPrefType = 'pref';
- const OSType kPrefCreator = 'MzTm';
- const ResType PREF_ResType = 'PREF';
- const ResIDT PREF_ResID = 1000;
-
-
- #ifdef COMMENT
-
- // It is strongly recommended to align pref structure in 4-byte.
-
- // For example:
- // struct {
- // Int16 year,
- // Int16 month,
- // Int16 day,
- // Int16 dummy, // This field is for fill-alignment for 4-byte.
- // Uint32 datetime
- // }
-
- // TMPL:
- // DWRD year
- // DWRD month
- // DWRD day
- // FLNG dummy // This field is for fill-alignment for 4-byte.
- // DLNG datetime
-
- #endif // COMMENT
-
- // --------------------------------------------------
- // • CPrefsFile()
- // --------------------------------------------------
-
- CPrefsFile::CPrefsFile()
- {
- SetupConstants();
- }
-
-
- // --------------------------------------------------
- // • CPrefsFile()
- // --------------------------------------------------
-
- CPrefsFile::CPrefsFile(
- ConstStr255Param inFileName,
- OSType inPrefFileCreator )
- : LPreferencesFile( inFileName, false )
- {
- SetupConstants();
-
- mPrefFileCreator = inPrefFileCreator;
- }
-
-
- // --------------------------------------------------
- // • ~CPrefsFile
- // --------------------------------------------------
-
- CPrefsFile::~CPrefsFile()
- {
- }
-
-
- // ==================================================
- // Member functions (handle member variables)
- // ==================================================
-
- // --------------------------------------------------
- // • SetupConstants
- // --------------------------------------------------
-
- void
- CPrefsFile::SetupConstants( void )
- {
- mPrefFileType = kPrefType;
- mPrefFileCreator = kPrefCreator;
- mPrefResType = PREF_ResType;
- mPrefResID = PREF_ResID;
- }
-
-
- // --------------------------------------------------
- // • SetupFileInfo
- // --------------------------------------------------
-
- void
- CPrefsFile::SetupFileInfo(
- OSType inPrefFileType,
- OSType inPrefFileCreator )
- {
- mPrefFileType = inPrefFileType;
- mPrefFileCreator = inPrefFileCreator;
- }
-
-
- // --------------------------------------------------
- // • SetupResType
- // --------------------------------------------------
-
- void
- CPrefsFile::SetupResType(
- ResType inPrefResType,
- ResIDT inPrefResID )
- {
- mPrefResType = inPrefResType;
- mPrefResID = inPrefResID;
- }
-
-
- // ==================================================
- // Member functions (read or write preferences settings)
- // ==================================================
-
- // --------------------------------------------------
- // • LoadPrefs
- // --------------------------------------------------
-
- OSErr
- CPrefsFile::LoadPrefs(
- long & outBlockDataLen,
- Handle outBlockDataH )
- {
- return LoadPrefs( outBlockDataLen, outBlockDataH, mPrefResType, mPrefResID );
- }
-
-
- OSErr
- CPrefsFile::LoadPrefs(
- long & outBlockDataLen,
- Handle outBlockDataH,
- ResType inPrefResType,
- ResIDT inPrefResID )
- {
- outBlockDataLen = 0;
-
- OSErr err = noErr;
-
- short vRefNum;
- vRefNum = OpenOrCreateResourceFork( fsRdWrPerm,
- mPrefFileCreator, mPrefFileType, smSystemScript );
-
- short curResFile = ::CurResFile();
- ::UseResFile( vRefNum );
-
- Handle resHandle = ::Get1Resource( inPrefResType, inPrefResID );
-
- if ( resHandle != NULL ) {
-
- // Read preferences data from the Prefs file.
- long resSize = ::GetHandleSize( resHandle );
- // if ( ioByteSize > resSize ) ioByteSize = resSize;
- outBlockDataLen = resSize;
- ::SetHandleSize( outBlockDataH, outBlockDataLen );
- ThrowIfOSErr_( ::MemError() );
- ::BlockMoveData( (void *) *resHandle, (void *) *outBlockDataH, outBlockDataLen );
- ::ReleaseResource( resHandle );
-
- } else {
-
- // Read default preferences from this application file, if Prefs file is empty.
- ::UseResFile( curResFile );
- Handle theHandle = ::GetResource( inPrefResType, inPrefResID );
- if ( theHandle != NULL ) {
- long resSize = ::GetHandleSize( theHandle );
- // if ( ioByteSize > resSize ) ioByteSize = resSize;
- outBlockDataLen = resSize;
- ::SetHandleSize( outBlockDataH, outBlockDataLen );
- ThrowIfOSErr_( ::MemError() );
- ::BlockMoveData( (Ptr) *theHandle, (Ptr) *outBlockDataH, outBlockDataLen );
- ::ReleaseResource( theHandle );
- } else {
- err = resNotFound;
- }
-
- }
-
- ::UseResFile( curResFile );
- CloseResourceFork();
-
- return err;
- }
-
-
- // --------------------------------------------------
- // • SavePrefs
- // --------------------------------------------------
-
- OSErr
- CPrefsFile::SavePrefs(
- long inBlockDataLen,
- Handle inBlockDataH )
- {
- return SavePrefs( inBlockDataLen, inBlockDataH, mPrefResType, mPrefResID );
- }
-
-
- OSErr
- CPrefsFile::SavePrefs(
- long inBlockDataLen,
- Handle inBlockDataH,
- ResType inPrefResType,
- ResIDT inPrefResID )
- {
- OSErr err = noErr;
-
- short vRefNum;
- vRefNum = OpenOrCreateResourceFork( fsRdWrPerm,
- mPrefFileCreator, mPrefFileType, smSystemScript );
-
- short curResFile = ::CurResFile();
- ::UseResFile( vRefNum );
-
- Handle resHandle = ::Get1Resource( inPrefResType, inPrefResID );
-
- // Remove the existing PREF resource.
- if ( resHandle != NULL ) {
-
- // If no changes, then do not touch the resource.
- if ( inBlockDataLen > 0 &&
- BlocksAreEqual( (void *)*inBlockDataH, (void *) *resHandle, inBlockDataLen ) ) {
- ::ReleaseResource( resHandle );
- goto out; }
- // Boolean theSame = true;
- // for ( long i = 0; i < inBlockDataLen; i++ ) {
- // if ( ((unsigned char *) *inBlockDataH)[i] != ((unsigned char *) *resHandle)[i] )
- // theSame = false;
- // }
- // if ( theSame ) { ::ReleaseResource( resHandle ); goto out; }
- ::RemoveResource( resHandle );
- ::DisposeHandle ( resHandle );
-
- }
-
- // Create new PREF resource by the preferences PrefRec data.
- resHandle = ::NewHandleClear( inBlockDataLen );
- ThrowIfNil_( resHandle );
-
- if ( resHandle != NULL ) {
-
- ::BlockMoveData( (void *) *inBlockDataH, (void *) *resHandle, inBlockDataLen );
- ::AddResource( resHandle, inPrefResType, inPrefResID, "\p" );
- ::WriteResource( resHandle );
- ::ReleaseResource( resHandle );
- // ::DisposeHandle( resHandle );
- // Do not use DisposeHandle to dispose of a handle obtained from the Resource Manager
- // (for example, by a previous call to GetResource); use ReleaseResource instead.
- // If, however, you have called DetachResource on a resource handle, you should dispose of
- // the storage by calling DisposeHandle. Inside Macintosh: Memory, page 2-34.
-
- } else {
- err = resNotFound;
- }
-
- out:
- ::UseResFile( curResFile );
- CloseResourceFork();
-
- return err;
- }
-
-
- // end of program
-